klcs.pageNumberName = "pageNum";
klcs.pageSizeName = "pageSize";
klcs.pageTotal = "pageTotal";


// 数组参数进行转化,转化成字符串.
klcs.arrayToString = function (params, arr) {

    var total = {};
    klcs.forEach(params, (item, index) => {
      // 如果是数组,且数组项不是对象
      if (klcs.isArray(item) && klcs.isObject(item[0]) === false) {
        // if (klcs.isObject)
        total[index] = item.join(",");
      } else {
        total[index] = item
      }
    })
    return total;
}

// 数组参数进行转化,转化成字符串.
klcs.formatAjaxParams = function (params, arr) {

    var total = {};
    klcs.forEach(params, (item, index) => {
      // 如果是数组,且数组项不是对象
      if (klcs.isArray(item) && klcs.isObject(item[0]) === false) {
        // if (klcs.isObject)
        total[index] = item.join(",");
      } else {
        total[index] = item
      }
    })
    return total;
}

// 传入对象 : params = {start1: '2021-01-01', end1: '2021-01-02'},
// obj = { "timeArray": ["start1", "end1"] }, 输出 { timeArray: [2021-01-01, '2021-01-02'] }
klcs.keyToArray = function (params, obj) {
  var total = { ...params };
  klcs.forEach(obj, (value, key) => {
    total[key] = [
      params[value[0]],
      params[value[1]]
    ];
    // 删除原有的属性
    delete total[value[0]];
    delete total[value[1]];
  })
  return total;
}

// 将以逗号作为分割符号的字符串参数进行转化,转化成数组.
  klcs.stringToArray = function (params, arr) {
    var total = {...params};
    klcs.forEach(arr, (item, index) => {
      // 如果是数组,且数组项不是对象
      if (params[item]) {
        total[item] = params[item].split(",");
      }
    })
    return total;
}

// 传入一个对象,将对象中指定的key,从字符串转化为数组
klcs.stringToArrayKey = function (params, arr) {
  var total = {...params};
  klcs.forEach(arr, (item, index) => {
    // 如果是数组,且数组项不是对象
    if (params[item]) {
      total[item] = params[item].split(",");
    }
  })
  return total;
}

// 
/**
 * 解包参数, 将接口数据转化表单所需要的数据
 * 1. 删除空数组,
 * 2. 转化需要的字符串 -> 数组
 * 2. 将单个对象参数 -> 数组
 * 3. 
 * @param {*} params 
 * @param {*} arr 
 */
klcs.unPackageParams = function (params, stringArray, arrayObject) {
  var data = { ...params, };
  // 将带逗号的参数 -> 数组
  data = klcs.stringToArrayKey(data, arrayObject);

  // 转化需要的字符串 -> 数组
  data = klcs.keyToArray(data, arrayObject);// 转化数组为字符串

  // 删除空数组属性
  // data = klcs.deleteEmptyArray(data);

  return data;
}

/**
 * 包装参数, 将需要转化的参数放入数组中
 * 1. 删除空数组,
 * 2. 转化数组 -> 字符串
 * 2. 将数组参数,转化为单个对象参数
 * 3. 
 * @param {*} params 
 * @param {*} arr 
 */
klcs.packageParams = function (params, stringArray, arrayObject) {
  var data = { ...params, };

  // 将数组参数,转化为单个对象参数
  klcs.each(arrayObject, (value, key) => {
    data = klcs.spliceAndDeleteArray(key, data, value);
  });


  // 转化数组为字符串,将需要转化的参数放入数组中.
  data = klcs.stringToArray(data, stringArray);// 转化数组为字符串
  // console.log(11111, data)
  // 删除空数组属性
  data = klcs.deleteEmptyArray(data);

  return data;
}
  
// 请求错误处理
klcs.successDataFlag = function (response) {
  if (1) {
    return true
  }
}

// 请求错误处理
klcs.errorDataFlag = function (response) {
  if (0) {
    message.error(response.data.msg);
    return true
  }
}

// 是否满足请求返回格式的状态函数记得补0
// 传入对象
// var obj = {
// 	   response: resp,// 数据源
// 	   haveData: fn1,// 存在数据,存在数据要分两种情况
//     // 部分无数据与全部有数据
// 	   noData:fn2// 不存在数据
// }
klcs.triggerSuccess = function (receive) {
  var respText = "",
    resp = receive.response,
    noData = receive.noData,
    haveData = receive.haveData;

  // 第一步，确定返回格式是对象，防止返回是乱码的情况
  if (klcs.isObject(resp)) {
    respText = "response is object;";

    // 第二步，判断是否存在数据
    if (resp.errno === 0) {
      // 存在数据
      respText += "existence data;";
      console.info(respText);
      haveData(resp.data);

      // 如果存在errno(防止resp是个空对象)，且错误码不为0
    } else if (resp.errno && resp.errno !== 0) {
      // 不存在数据
      respText += "no data;";
      console.info(respText);
      noData();
    }
  } else {
    // 返回不为对象,可能是乱码
    respText = "response is'not object;";
    console.warn(respText);
  }
};


klcs.disposeData = function (response) {
  return response.list;
}
klcs.getTotal = function(response) {
  return response.total;
}

klcs.get = function ({ url, params }) {
  return klcs.ajaxTest()
};

klcs.post = function ({ url, params }) {
  return klcs.ajaxTest()
};

// 写一个方法,将一个对象的属性值中,如果属性值为空数组,则删除这个属性
klcs.deleteEmptyArray = function (obj) {
  for (let key in obj) {
    if (klcs.isArray(obj[key]) && obj[key].length === 0) {
      delete obj[key]
    }
  }
  return obj
}

klcs.spliceAndDeleteArray = function (origin, params, arrayValueName) {
  var total = {};
  // 数组模式的参数特殊处理
  if (arrayValueName?.length && params[origin]) {
    params[arrayValueName?.[0]] = params[origin]?.[0];
    params[arrayValueName?.[1]] = params[origin]?.[1];
    delete params[origin];
  }
  total = klcs.deepClone(true, {}, params);
  return total;
}

/** 
 * @description: ajax功能配置项,完整配置表
 * @author: kelichao
 * @care 注意,这个工具函数不要用es6写法,是用来打进npm包的代码.
 * date: 2021-03-11
 */
function ajax(options) {

  var Default = {
    type: "get",// 默认为get
    data:{},// 参数
    contentType:'',//  请求头
    dataType:"json",
    processData: true,
    timeout:"",// 超时时间
    headers:{},// 头部参数
    url:"",// 链接地址相对路径
    wholeUrl:"",// 全地址,用于解决特殊情况,如果有相对路径,该参数无效
    success: function(){},
    error:function(){},
    complete:function() {}
  };

  options = Object.assign(Default,options);

  // var reg=new RegExp(/(http)|(https)/);
  // var flag = reg.test(options.url);

  // // 全路径
  // if (flag) {

  // } else {
  //   ($$.url + options.url)
  // }
  

  return $.ajax({
    type: options.type ,
    dataType:options.dataType,
    headers:options.headers,
    contentType: options.contentType ,//  请求头
    processData:options.processData,
    data: Object.assign(
      // {token: $$.token}, // 默认参数,每个请求需要夹带
      options.data
    )
    ,
    timeout: options.timeout || 40000,
    url: options.url ? ($$.url + options.url) : options.wholeUrl,
    success: function(resp) {
      options.success(resp)
    },
    error: function(e) {
       options.error(resp)
      // console.error({
      //   code: e.status,
      //   message: e.statusText,
      //   detail: e
      // });
    },
    complete:function (info){
      options.complete(info)
      // console.info("请求完成")
      // console.log(info)
    
    },
  })
    // .then(function(resp) { })
    // .catch(function(e) { })

}

export default ajax